.\" Process this file with
.\" groff -man -Tascii foo.1
.\"
.TH Tss2_Tcti_Device_Init 3 "MARCH 2018" "TPM2 Software Stack"
.SH NAME
Tss2_Tcti_Device_init \- Initialization function for the device TCTI library.
.SH SYNOPSIS
.B #include <tcti/tcti_device.h>
.sp
.sp
.BI "TSS2_RC Tss2_Tcti_Device_Init (TSS2_TCTI_CONTEXT " "*tctiContext" ", size_t " "*size" ", const char " "*conf" ");"
.sp
The
.BR  Tss2_Tcti_Device_Init ()
function initializes a TCTI context used to communicate with the TPM device
driver.
.SH DESCRIPTION
.BR Tss2_Tcti_Device_Init ()
attempts to initialize a caller allocated
.I tctiContext
of size
.I size
\&. Since the
.I tctiContext
must be a caller allocated buffer, the caller needs to know the size required
by the TCTI library. The minimum size of this context can be discovered by
providing
.BR NULL
for the
.I tctiContext
and a non-
.BR NULL
.I size
parameter. The initialization function will then populate the
.I size
parameter with the minimum size of the
.I tctiContext
buffer. The caller must then allocate a buffer of this size (or larger) and
call
.B Tss2_Tcti_Device_Init ()
again providing the newly allocated
.I tctiContext
and the size of this context in the
.I size
parameter. This pattern is common to all TCTI initialization functions. We
provide an example of this pattern using the
.BR Tss2_Tcti_Device_Init ()
function in the section titled
.B EXAMPLE.
.sp
The
.I conf
parameter is a C string. If this string is
.BR NULL
then the library will use a default configuration string for the caller.
Alternatively, the caller may provide a configuration string that must
contain the path to the device node exposed by the TPM device driver.
.sp
Once initialized, the TCTI context returned exposes the Trusted Computing
Group (TCG) defined API for the lowest level communication with the TPM.
Using this API the caller can exchange (send / receive) TPM2 command and
response buffers with the TPM device driver. In nearly all cases however, the
caller will initialize a context using this function before passing the
context to a higher level API like the System API (SAPI), and then never touch
it again.
.sp
TCG TSS 2.0 TPM Command
Transmission Interface (TCTI) API
Specification

For a more thorough discussion of the TCTI API see the \*(lqTCG TSS 2.0 TPM Command
Transmission Interface (TCTI) API Specification\*(rq as published by
the TCG:
\%https://trustedcomputinggroup.org/wp-content/uploads/TSS_TCTI_Version-1.0_Revision-05_Review_END030918.pdf
.SH RETURN VALUE
A successful call to
.BR Tss2_Tcti_Device_Init ()
will return
.B TSS2_RC_SUCCESS.
An unsuccessful call will produce a response code described in section
.B ERRORS.
.SH ERRORS
.B TSS2_TCTI_RC_BAD_VALUE
is returned if any parameters contain unexpected values.
.B TSS2_TCTI_RC_BAD_REFERENCE
is returned if any parameters are NULL when they should not be.
.B TSS2_TCTI_RC_BAD_CONTEXT
is returned if the size of the provided
.I tctiContext
is insufficient.
.SH EXAMPLE
TCTI initialization fragment:
.sp
.nf
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include <tcti/tcti_device.h>

TSS2_RC rc;
TSS2_TCTI_CONTEXT *tcti_context;
size_t size;
char *conf = "/dev/tpm0",

rc = Tss2_Tcti_Device_Init (NULL, &size, NULL);
if (rc != TSS2_RC_SUCCESS) {
    fprintf (stderr, "Failed to get allocation size for device TCTI "
             " context: 0x%" PRIx32 "\n", rc);
    exit (EXIT_FAILURE);
}
tcti_context = calloc (1, size);
if (tcti_context == NULL) {
    fprintf (stderr, "Allocation for TCTI context failed: %s\n",
             strerror (errno));
    exit (EXIT_FAILURE);
}
rc = Tss2_Tcti_Device_Init (&tcti_context, &size, &conf);
if (rc != TSS2_RC_SUCCESS) {
    fprintf (stderr, "Failed to initialize device TCTI context: "
             "0x%" PRIx32 "\n", rc);
    free (tcti_context);
    exit (EXIT_FAILURE);
}
exit (EXIT_SUCCESS);
.fi
